package com.hzw.saas.api.hpc;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hzw.saas.api.hpc.bo.*;
import com.hzw.saas.api.hpc.enums.DisplayUnit;
import com.hzw.saas.common.config.util.PageParam;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 用户机时明细表 服务类
 * </p>
 *
 * @author zzl
 * @since 2021-02-05
 */
public interface IHpcAccountDetailService {

    HpcAccountDetailBo saveHpcAccountDetail(HpcAccountDetailBo hpcAccountDetailDto);

    /**
     * 获取某个用户的
     *
     * @param userId
     * @param hpcAccountUserId
     * @return
     */
    double countHpcAccountDetailByUser(String userId, String hpcAccountUserId);

    /**
     * 分页获取机时使用详情列表
     *
     * @param pageParam
     * @param accountRecordIds
     * @param startDate
     * @param endDate
     * @return
     */
    IPage<HpcAccountDetailBo> listHpcAccountDetail(PageParam pageParam, List<String> accountRecordIds, Date startDate, Date endDate);

    /**
     * 获取机时使用记录
     *
     * @param accountRecordIds
     * @param startDate        yyyy-MM-dd
     * @param endDate          yyyy-MM-dd
     * @return
     */
    List<HpcAccountUsageBo> listHpcAccountUsage(List<String> accountRecordIds, Date startDate, Date endDate, DisplayUnit displayUnit);

    /**
     * 获取指定天数内的机时使用记录
     *
     * @param accountRecordIds 用户账户记录ID
     * @param offsetDays       偏移天数
     * @return 偏移天数对应的核时列表, 如近3天，[10,5,10], 第一位元素为当天，第二位元素为前一天，以此类推
     */
    List<HpcAccountUsageBo> listHpcAccountUsage(List<String> accountRecordIds, int offsetDays, DisplayUnit displayUnit);

    /**
     * 批量添加
     *
     * @param hpcAccountDetails
     */
    void saveBatch(List<HpcAccountDetailBo> hpcAccountDetails);

    /**
     * 批量添加（通过taskId和AccountId和EndTime）
     *
     * @param hpcAccountDetails
     */
    boolean saveBatchByTaskIdAndAccountIdAndTime(List<HpcAccountDetailBo> hpcAccountDetails);

    /**
     * 通过指定的日期范围，查询HPC明细表中的核时使用总量
     *
     * @param startDate >=
     * @param endDate   <=
     * @return
     */
    Double getHpcCoreSumByScopeDate(List<String> accountRecordIds, Date startDate, Date endDate);

    /**
     * 获取账户的总使用核时（效率高）
     *
     * @param accountRecordIds
     * @return
     */
    Double getHpcAccountCoreTimeSums(List<String> accountRecordIds);

    /**
     * 获取账户的总使用核时（效率高）
     *
     * @param accountRecordId
     * @return
     */
    Double getHpcAccountCoreTimeSum(String accountRecordId);

    /**
     * 指定recordIds获取收支明细
     *
     * @param pageParam
     * @param recordIds
     * @param startDate
     * @param endDate
     * @return
     */
    IPage<HpcAccountUsageWithIncreaseBo> listHpcAccountUsageWithIncreaseUsage(PageParam pageParam, List<String> recordIds, Date startDate, Date endDate);

    /**
     * 指定recordIds获取算力增值曲线
     *
     * @param recordIds
     * @param startDate
     * @param endDate
     * @return
     */
    List<HpcAccountIncreaseUsageBo> listHpcAccountIncreaseUsage(List<String> recordIds, Date startDate, Date endDate);

    /**
     * 获取最大的任务结束时间
     *
     * @param recordIds
     * @return
     */
    Date getMaxEndTimeByRecordIds(List<String> recordIds);

    /**
     * 获取hpc用户消耗账单
     * @param providerType
     * @param keyword
     * @param startDate
     * @param endDate
     * @return
     */
    List<HpcAccountBillBO> listHpcAccountBill(String providerType, String keyword, Date startDate, Date endDate);

    List<HpcAccountDetailBo> listHpcAccountBillTasks(List<String> hpcAccountRecordIds, Date startDate, Date endDate);
}
